/**
 * @author 艾尼亚尔
 * @date 2025/8/7
 * @description
 */
import Cookies from 'js-cookie';
import {config} from '@/config'

const TOKEN_KEY: string = config.TOKEN_KEY;
//定义token过期时间
const timeKey: string = config.LOCAL_STORAGE_key + '_expire_time'

/**
 * 保存数据到本地存储
 * @param key - 存储键名（会自动添加配置前缀）
 * @param data - 要存储的数据（会自动序列化为JSON）
 * @template T - 存储数据的类型约束
 */
export function setLocalStorage<T>(key: string, data: T): void {
  try {
    localStorage.setItem(
      `${config.LOCAL_STORAGE_key}${key}`,
      JSON.stringify(data)
    );
  } catch (error) {
    console.error(`本地存储写入失败 (key: ${key}):`, error);

    // 如果是存储空间不足，可以添加自动清理逻辑
    if (error instanceof DOMException && error.name === 'QuotaExceededError') {
      console.warn('本地存储空间不足，建议清理');
    }
  }
}

/**
 * 获取本地存储的数据
 * @param key 存储键名
 * @returns 存储的值（自动反序列化），不存在时返回 null
 */
export function getLocalStorage<T>(key: string): T | null {
  const storedValue = localStorage.getItem(`${config.LOCAL_STORAGE_key}${key}`);

  if (storedValue && storedValue !== "undefined") {
    try {
      return JSON.parse(storedValue) as T;
    } catch (error) {
      console.error(`解析 localStorage 数据失败 (key: ${key}):`, error);
      return null;
    }
  }
  return null;
}

/**
 * 删除本地存储数据
 * @param key
 */
export function removeLocalStorage(key: string) {
  localStorage.removeItem(config.LOCAL_STORAGE_key + key);
}


/**
 * 存储token
 * @param token token
 * @param expireTime 过期时间 从后端过来
 */
export function setToken(token: string, expireTime: number): void {
  //保存时间为8小时
  // const inFifteenMinutes = new Date(new Date().getTime() + 8 * 3600 * 1000);
  const inFifteenMinutes = new Date(expireTime);
  Cookies.set(TOKEN_KEY, token, {expires: inFifteenMinutes});
}

/**
 * 获取token
 */
export function getToken(): string {
  const token = Cookies.get(TOKEN_KEY);
  if (token) return token;
  else return "";
}

/**
 * 删除token
 */
export function removeToken(): void {
  Cookies.remove(TOKEN_KEY); // fail!
}

/**
 * 清空sessionStorage
 */
export function clearStorage(): void {
  return sessionStorage.clear();
}

/**
 * 设置token过期时间
 * @param time
 */
export function setTokenTime(time: number): void {
  return sessionStorage.setItem(timeKey, String(time));
}

/**
 * 获取token过期时间
 */
export function getTokenTime(): string | null {
  return sessionStorage.getItem(timeKey);
}

/**
 * 清空token过期时间
 */
export function removeTokenTime(): void {
  return sessionStorage.setItem(timeKey, String(0));
}

/**
 * 文件上传头部
 */
export function uploadHeaders() {
  const token = getToken();
  return {
    "Authorization": `${config.TOKEN_PREFIX}${token}`,
  }
}

